package co.yixiang.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 用于在实体类字段上标注查询相关信息的注解
 * 主要用于简化查询条件的构建和提高代码的可读性
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Query {

    /**
     * 基本对象的属性名
     * 用于指定查询时对应的数据库字段名
     * 如果未指定，则默认使用字段名
     */
    String propName() default "";

    /**
     * 查询方式
     * 用于指定该字段的查询类型，如相等、大于等于等
     * 默认为相等查询
     */
    Type type() default Type.EQUAL;

    /**
     * 多字段模糊搜索，仅支持String类型字段
     * 多个字段名用逗号隔开，如@Query(blurry = "email,username")
     * 这种方式允许在多个字段中进行模糊搜索
     */
    String blurry() default "";

    /**
     * 查询类型枚举
     * 定义了各种可用的查询方式
     */
    enum Type {
        // 相等查询
        EQUAL,
        // 大于等于查询
        GREATER_THAN,
        // 大于查询，不等于
        GREATER_THAN_NQ,
        // 小于等于查询
        LESS_THAN,
        // 中间模糊查询
        INNER_LIKE,
        // 左侧模糊查询
        LEFT_LIKE,
        // 右侧模糊查询
        RIGHT_LIKE,
        // 小于查询，不等于
        LESS_THAN_NQ,
        // 包含查询
        IN,
        // 不等于查询
        NOT_EQUAL,
        // between 查询
        BETWEEN,
        // 不为空查询
        NOT_NULL,
        // 查询时间，用于查询时间戳
        UNIX_TIMESTAMP
    }
}
